package cn.always.xiajia.framework.mybatis.core.handler;

import java.time.LocalDateTime;
import java.util.Objects;

import org.apache.ibatis.reflection.MetaObject;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import cn.always.xiajia.framework.mybatis.core.entity.BaseEntity;
import cn.always.xiajia.framework.security.core.util.SecurityFrameworkUtils;

/**
 * 通用参数填充实现类
 *
 * 如果没有显式的对通用参数进行赋值，这里会对通用参数进行填充、赋值
 * 
 * @author xgj
 *
 */
public class DefaultDBFieldHandler implements MetaObjectHandler {

	/**
	 * 插入
	 */
	@Override
	public void insertFill(MetaObject metaObject) {
		if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
			BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();

			LocalDateTime current = LocalDateTime.now();
			// 创建时间为空，则以当前时间为插入时间
			if (Objects.isNull(baseEntity.getCreateTime())) {
				baseEntity.setCreateTime(current);
			}
			// 更新时间为空，则以当前时间为更新时间
			if (Objects.isNull(baseEntity.getModifyTime())) {
				baseEntity.setModifyTime(current);
			}

			Long userId = SecurityFrameworkUtils.getLoginUserId();
			// 当前登录用户不为空，创建人为空，则当前登录用户为创建人
			if (Objects.nonNull(userId) && Objects.isNull(baseEntity.getCreateUserId())) {
				baseEntity.setCreateUserId(userId);
			}
			// 当前登录用户不为空，更新人为空，则当前登录用户为更新人
			if (Objects.nonNull(userId) && Objects.isNull(baseEntity.getModifyUserId())) {
				baseEntity.setModifyUserId(userId);
			}

			String userName = SecurityFrameworkUtils.getLoginUserName();
			// 当前登录用户不为空，创建人名称为空，则当前登录用户为创建人名称
			if (Objects.nonNull(userName) && Objects.isNull(baseEntity.getCreateUserName())) {
				baseEntity.setCreateUserName(userName);
			}
			// 当前登录用户不为空，更新人名称为空，则当前登录用户为更新人名称
			if (Objects.nonNull(userName) && Objects.isNull(baseEntity.getModifyUserName())) {
				baseEntity.setModifyUserName(userName);
			}
		}
	}

	/**
	 * 更新
	 */
	@Override
	public void updateFill(MetaObject metaObject) {
		if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
			BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();

			LocalDateTime current = LocalDateTime.now();
			// 更新时间为空，则以当前时间为更新时间
			if (Objects.isNull(baseEntity.getModifyTime())) {
				baseEntity.setModifyTime(current);
			}

			Long userId = SecurityFrameworkUtils.getLoginUserId();
			// 当前登录用户不为空，更新人为空，则当前登录用户为更新人
			if (Objects.nonNull(userId) && Objects.isNull(baseEntity.getModifyUserId())) {
				baseEntity.setModifyUserId(userId);
			}

			String userName = SecurityFrameworkUtils.getLoginUserName();
			// 当前登录用户不为空，更新人名称为空，则当前登录用户为更新人名称
			if (Objects.nonNull(userName) && Objects.isNull(baseEntity.getModifyUserName())) {
				baseEntity.setModifyUserName(userName);
			}
		}
	}
}
